在做輪廓化、膨脹、侵蝕前會先將圖片做高斯模糊的處理,主因是這樣可以避免邊緣被過度檢測,且高斯模糊能平滑圖像中的些微細節,有助於強調真實細節避免過多微小的變化
G = cv2.GaussianBlur(img, (15, 15), 0)
這邊我把高斯核設為 (15, 15),可以讓模糊更明顯
在圖像中檢測並突出顯示邊緣,這些邊緣常代表顏色或亮度發生劇烈變化的地方,透過邊緣檢測,可以提取出圖像中物體的形狀、結構,與其他重要的特徵
cv2.Canny(image, l, h)
這個函數會先將 image 轉換成灰階圖像,在設定低閥值與高閥值參數
<補充>
低閥值:用來判定邊緣的強度
高閥值:用來判定邊緣的強度。強邊緣區域比弱邊緣更有可能是圖像中的真實邊緣
C = cv2.Canny(G, 50, 150)
cv2.imshow('Canny Cats', C)
cv2.waitKey(0)
擴大圖像中白色或高亮部分的區域,通常是邊緣或前景。可以用來加粗物體的邊緣,填補邊緣中的小孔或間隙,在形態學操作中常與侵蝕結合使用
cv2.dilate(image, (9, 9), iterations=4)
將卷積核設為 (9, 9),來定義膨脹操作時的鄰域大小,iterations 表示要迭代次數,能加粗邊緣
D = cv2.dilate(C, (9, 9), iterations=4)
cv2.imshow('Dilated Cats', D)
cv2.waitKey(0)
<補充> 二值化:是將圖像中的像素值轉換為僅有兩種可能值(通常是 0 和 255)的圖像處理技術,這種圖像也被稱為二進制圖像或黑白圖像
縮小圖像中白色或高亮的部分區域。可以削弱或去除物體邊緣的細小雜訊,且能分離或去除圖像中不相連的物體
cv2.erode(image, (5, 5), iterations=2)
將卷積核設為(5, 5),erode 會把該區域內的最小值應用到中心像素上,從而「縮小」白色(或前景)區域,並利用 iterations 迭代 2 次
E = cv2.erode(D, (5, 5), iterations=2)
cv2.imshow('Eroded Cats', E)
cv2.waitKey(0)
參考資料:
https://www.walnutpi.com/en/docs/opencv/detection/contour_detection/